package com.scott.itcast.semaphore;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;


/**
 * 信号灯测试
 */
public class SemaphoreTest {
	public static void main(String[] args) {
		
		ExecutorService threadPool = Executors.newCachedThreadPool();
		
		//信号灯
		final Semaphore sp = new Semaphore(3);
		
		// new 10个任务
		for (int i = 0; i < 10; i++) {
			final int counter =i+1;
			Runnable runnable = new Runnable() {
				public void run() {
					try {
						//因为只有3个坑 所以一次最多只能有3个人进去 另外7个人等。只有当3个人中的任意1个出来的时候。7个人中才会有1个人可以进去
						//获得其中的1盏灯
						sp.acquire();
						System.out.println(sp.availablePermits());
					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}
					System.out.println("线程"+counter +"["+ Thread.currentThread().getName() + "]进入，当前已有" + (3 - sp.availablePermits()) + "个并发");
					try {
						Thread.sleep((long) (Math.random() * 10000));
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("线程"+counter +"["+ Thread.currentThread().getName() + "]即将离开");
					sp.release();
					System.out.println(sp.availablePermits());
					// 下面代码有时候执行不准确，因为其没有和上面的代码合成原子单元
					System.out.println("线程"+counter  +"["+Thread.currentThread().getName() + "]已离开，当前已有" + (3 - sp.availablePermits()) + "个并发");
				}
			};
			
			//线程池执行任务
			threadPool.execute(runnable);
		}
	}

}
